package com.ruoyi.common.core.domain.entity;

import java.util.Date;
import java.util.List;

import jakarta.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.annotation.Excel.Type;
import com.ruoyi.common.annotation.Excels;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.xss.Xss;
import org.babyfish.jimmer.sql.*;
import org.springframework.lang.Nullable;

/**
 * 用户对象 sys_user
 *
 * @author ruoyi
 */
@Entity
@Table(name = "sys_user")
public interface SysUser extends BaseEntity {

    /**
     * 用户ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    long userId();

    /**
     * 部门ID
     */
    @IdView
    long deptId();

    /**
     * 用户账号
     */
    String userName();

    /**
     * 用户昵称
     */
    String nickName();

    /**
     * 用户邮箱
     */
    @Nullable
    String email();

    /**
     * 手机号码
     */
    @Nullable
    String phonenumber();

    /**
     * 用户性别
     */
    @Nullable
    String sex();

    /**
     * 用户头像
     */
    @Nullable
    String avatar();

    /**
     * 密码
     */
    String password();

    /**
     * 账号状态（0正常 1停用）
     */
    String status();

    /**
     * 删除标志（0代表存在 2代表删除）
     */
    @Default("0")
    @LogicalDeleted("2")
    int delFlag();

    /**
     * 最后登录IP
     */
    @Nullable
    String loginIp();

    /**
     * 最后登录时间
     */
    @Nullable
    Date loginDate();

    /**
     * 密码最后更新时间
     */
    @Nullable
    Date pwdUpdateDate();

    /**
     * 部门对象
     */
    @ManyToOne
    @OnDissociate(DissociateAction.DELETE)
    SysDept dept();

    /**
     * 角色对象
     */
    @ManyToMany
    @JoinTable(
            name = "sys_user_role",
            joinColumnName = "user_id",
            inverseJoinColumnName = "role_id"
    )
    List<SysRole> roles();

    /**
     * 角色组
     */
    @IdView("roles")
    List<Long> roleIds();

    /**
     * 岗位组
     */
    @IdView("posts")
    List<Long> postIds();

    @ManyToMany
    @JoinTable(
            name = "sys_user_post",
            joinColumnName = "user_id",
            inverseJoinColumnName = "post_id"
    )
    List<SysPost> posts();

}
